﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Collections;
using System.IO;

namespace Example
{
    class Conexion
    {
        TcpClient socket;
        Thread hilo;
        
        SalonChat clientepadre;


        /// <summary>
        /// Constructor de la conexion
        /// </summary>
        /// <param name="papi">Padre (Interfaz-Partida)</param>
        /// <param name="tc">TcpClient o socket sobre el que se arranca el hilo de la conexion</param>
        public Conexion(SalonChat papi, TcpClient tc)
        {
            socket = tc;
            clientepadre = papi;
            hilo = new Thread(this.RecibirMensajeInfinito);
            hilo.Start();
        }

        /// <summary>
        /// Método que recibe mensajes de manera infinita
        /// </summary>
        private void RecibirMensajeInfinito()
        {
            for (; ; )
            {
                Thread.Sleep(100);
                byte[] msg = new Byte[Example.SalonChat.Constants.maxNoOfBytes];
                byte count1 = 0x01;
                for (int i = 0; i < msg.Length; i++) msg[i] = count1++;

                try
                {
                    //Leemos el buffer por si se ha recibido algo
                    int readBytes = socket.GetStream().Read(msg, 0, msg.Length);
                    //intentamos recoger el mensaje y ponerlo en pantalla
                    StringBuilder str = new StringBuilder(Example.SalonChat.Constants.maxNoOfBytes);
                    for (int count = 0; count < readBytes; count++)
                    {
                        char ch = (char)msg[count];
                        str = str.Append(ch);
                    }
                    //Pintamos el mensaje a través de un delegado y además mandamos el mensaje a los demás usuarios.
                    clientepadre.delegarRecibirMensaje(str.ToString());
                }
                catch (IOException)
                {
                    return; //ToDo: Hacer algo con el error }
                }
            }

        }

        /// <summary>
        /// Método que manda el mensaje al Cliente convertidos en Bytes
        /// </summary>
        /// <param name="mensaje">Mensaje en string que se convertira a bytes para enviar</param>
        public void enviarMensaje(String mensaje)
        {
            char[] charArray = mensaje.ToCharArray();
            byte[] byteArray = new byte[charArray.Length];
            for (int count = 0; count < charArray.Length; count++)
                byteArray[count] = (byte)charArray[count];

            socket.GetStream().Write(byteArray, 0, byteArray.Length);
        }

        /*getSocket*/
        public TcpClient getSocket()
        {
            return this.socket;
        }
        /*parar el hilo*/
        public void stopThread()
        {
            this.hilo.Abort();
        }

    }
}

